package ar.edu.unicen.exa.isistan.archassis.ia.seed;

import java.io.Serializable;
import java.util.List;

public class Run implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String paquete;
	private String nombreMetodo;
	private List<String> parametros;
	private String nombreMetodoOrigen;
	private String referencia = "";
	private String ejecuta = "";
	
	public Run(String paquete, String nombreMetodo, List<String> parametros, String nombreMetodoOrigen){
		this.paquete = paquete;
		this.nombreMetodo = nombreMetodo;
		this.parametros = parametros;
		this.nombreMetodoOrigen = nombreMetodoOrigen;
		
	}
	public String getNombreMetodoOrigen() {
		return nombreMetodoOrigen;
	}
	public void setNombreMetodoOrigen(String nombreMetodoOrigen) {
		this.nombreMetodoOrigen = nombreMetodoOrigen;
	}
	public String getPaquete() {
		return paquete;
	}
	public void setPaquete(String paquete) {
		this.paquete = paquete;
	}
	public String getMetaClass(){
		return paquete + "." + nombreMetodo;
	}
	
	public String getNombreMetodo() {
		return nombreMetodo;
	}
	public void setNombreMetodo(String nombreMetodo) {
		this.nombreMetodo = nombreMetodo;
	}
	public List<String> getParametros() {
		return parametros;
	}
	public void setParametros(List<String> parametros) {
		this.parametros = parametros;
	}
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Run) {
			if (this.getMetaClass()
					.equals(((Run) obj).getMetaClass())) {
				if(!nombreMetodoOrigen.equals(((Run) obj).getNombreMetodoOrigen())){
					return false;
				}
				if (((Run) obj).getParametros().size() != parametros
						.size()) {
					return false;
				}
				if(!parametros.equals(((Run) obj).getParametros())){
					return false;
				}
//				for (String param : parametros) {
//					if (!((Run) obj).getParametros().contains(param)) {
//						return false;
//					}
//				}
				return true;
			}
		}
		return false;
	}
	
	public String getParametrosString(){
		String result="";
		for (int i=0; i<parametros.size(); i++) {
			if(i+1 <parametros.size()){
				result =result + parametros.get(i) + ", ";
			}else{
				result =result + parametros.get(i);
			}
		}
		return result;
	}
	
	@Override
	public String toString() {
		if(referencia.equals("")){
			referencia = this.getMetaClass() + "(" + this.getParametrosString() + ")";
		}
		return referencia;
	}
	
	public String getReferencia() {
		if(referencia.equals("")){
			referencia = nombreMetodoOrigen + MetodoSeed.UNION + this.getMetaClass() + "(" + this.getParametrosString() + ")";
		}
		return referencia;
	}
	
	public String getEjecuta() {
		if(ejecuta == null || ejecuta.equals("")){
			ejecuta = this.getMetaClass() + "(" + this.getParametrosString() + ")";
		}
		return ejecuta;
	}
	
}
